﻿using GrapeCity.Forguncy.CellTypes;
using GrapeCity.Forguncy.Commands;
using GrapeCity.Forguncy.Plugin;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Windows;
using Vant.Properties;
using Vant.WpfControls.DrawingObject;

namespace Vant.CellTypes
{
    public class TimelineDesigner : CellTypeDesigner<Timeline>, ISupportPropertyInitialize
    {
        public override FrameworkElement GetDrawingControl(ICellInfo cellInfo, IDrawingHelper drawingHelper)
        {
            return new VerticalStepDrawingObject(this.CellType, cellInfo, drawingHelper);
        }

        public void InitDefaultPropertyValues(IBuilderContext context)
        {
            for (int i = 0; i < 3; i++)
            {
                this.CellType.options.Add(new TimeStep()
                {
                    value = (i + 1).ToString(),
                    title = Resources.Timeline_TimeStep_DefaultTitle + (i + 1).ToString(),
                    timestamp = DateTime.Today.AddDays(i).ToString("yyyy/MM/dd"),
                });
            }
            this.CellType.format = "yyyy/MM/dd";
        }
    }

    [Designer("Vant.CellTypes.TimelineDesigner, Vant")]
    [Icon("pack://application:,,,/Vant;component/Resources/Images/Timeline.png")]
    [OrderWeight((int)Utils.OrderWeight.Timeline)]
    public class Timeline : VantCellTypeBase, ICommandCellType, ISupportDefaultValue, IStepBase
    {
        [SRDisplayName(nameof(Resources.ValueChangeCommand))]
        public List<Command> CommandList { get; set; } = new List<Command>();

        public CommandExcuteKind CommandExcuteKind => CommandExcuteKind.OnValueChanged;

        [SRDisplayName(nameof(Resources.Timeline_UseBinding))]
        [BoolProperty]
        [MergableProperty(false)]
        public bool useBinding { get; set; } = false;

        [SRDisplayName(nameof(Resources.Timeline_Options))]
        [ListProperty(IndentLevel = 1)]
        public List<TimeStep> options { get; set; } = new List<TimeStep>();

        [SRBindingDataSourceProperty(Columns = nameof(Resources.Timeline_BindingOptions_Columns), IndentLevel = 1)]
        [SRDisplayName(nameof(Resources.BindingOptions))]
        public object bindingOptions { get; set; }

        [SRDisplayName(nameof(Resources.Vant_DefaultValue))]
        [FormulaProperty]
        public object DefaultValue { get; set; }

        [SRDisplayName(nameof(Resources.Timeline_ActiveIcon))]
        [IconProperty(DefaultIconColor = "#07c160")]
        public ImageValue activeIcon { get; set; }

        [SRDisplayName(nameof(Resources.Timeline_FinishIcon))]
        [IconProperty(DefaultIconColor = "#07c160")]
        public ImageValue finishIcon { get; set; }

        [SRDisplayName(nameof(Resources.Timeline_ActiveColor))]
        [ColorProperty]
        public string activeColor { get; set; } = "Accent 1";

        [SRDisplayName(nameof(Resources.Timeline_InactiveIcon))]
        [IconProperty(DefaultIconColor = "#969799")]
        public ImageValue inactiveIcon { get; set; }

        [SRDisplayName(nameof(Resources.Timeline_InactiveColor))]
        [ColorProperty]
        public string inactiveColor { get; set; } = "#969799";

        [SRDisplayName(nameof(Resources.Timeline_Placement))]
        [SRComboProperty(ValueList = "top|bottom", DisplayList = nameof(Resources.Timeline_Placement_DisplayList))]
        public string placement { get; set; } = "bottom";

        [SRDisplayName(nameof(Resources.Timeline_Format))]
        [SRComboProperty(ValueList = nameof(Resources.Timeline_Format_ValueList), IsSelectOnly = false)]

        public string format { get; set; }

        [Browsable(false)]
        [JsonIgnore]
        public bool NeedFormatDefaultValue { get; set; } = true;

        [RunTimeMethod]
        [SRDisplayName(nameof(Resources.Timeline_SetDataSource))]
        [SRDescription(nameof(Resources.Timeline_SetDataSource_Description))]
        public void SetJSONDataSource(
                [SRItemDisplayName(nameof(Resources.Timeline_dataSource))]
                [Required]
                string dataSource,
                [SRItemDisplayName(nameof(Resources.Timeline_valueProperty))]
                [Required]
                string valueProperty = "value",
                [SRItemDisplayName(nameof(Resources.Timeline_titleProperty))]
                [Required]
                string titleProperty = "title",
                [SRItemDisplayName(nameof(Resources.Timeline_timestampProperty))]
                [Required]
                string timestampProperty = "timestamp")
        {
            //
        }

        [RunTimeMethod]
        [SRDisplayName(nameof(Resources.Timeline_UpdateActiveIcon))]
        public void UpdateActiveIcon(
            [SRItemDisplayName(nameof(Resources.Timeline_ActiveIcon))]
            [IconProperty]
            ImageValue activeIcon)
        {
            //
        }

        [RunTimeMethod]
        [SRDisplayName(nameof(Resources.Timeline_UpdateActiveColor))]
        public void UpdateActiveColor(
            [SRItemDisplayName(nameof(Resources.Timeline_ActiveColor))]
            [ColorProperty(SupportNoFill = true)]
            ImageValue activeColor)
        {
            //
        }

        public override string ToString()
        {
            return Resources.Timeline_DisplayName;
        }

        public override bool GetDesignerPropertyVisible(string propertyName)
        {
            if (propertyName == nameof(options))
            {
                return !useBinding;
            }
            if (propertyName == nameof(bindingOptions))
            {
                return useBinding;
            }
            return base.GetDesignerPropertyVisible(propertyName);
        }
    }

    public class TimeStep
    {
        [SRDisplayName(nameof(Resources.Value))]
        public string value { get; set; }

        [SRDisplayName(nameof(Resources.Timeline_TimeStep_Title))]
        public string title { get; set; }

        [SRDisplayName(nameof(Resources.Timeline_TimeStep_Timestamp))]
        public string timestamp { get; set; }
    }
}
